<?php

namespace app\admin\logic;
use app\admin\exception\LogicException;

class LogicContext
{

	/**
	 * @return mixed
	 * @throws LogicException
	 * 根据调用者的上下文执行特定的逻辑。
	 * 此方法主要用于根据触发它的函数调用来定位并执行相应的逻辑类。
	 * 如果对应的逻辑类存在，则创建该类的实例并执行其 run 方法。
	 * 如果逻辑类不存在或 $logicClassName 为空，则抛出异常。
	 */
	public function execute() {
	    // 生成调用回溯，忽略参数信息
	    $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
	    // 获取调用者的信息，即调用当前方法的函数
	    $caller = $backtrace[1];
	    // 初始化逻辑类名为空字符串
	    $callerFunctionName = '';
		$callerClassName = '';
		$logicClassName = '';
	    // 检查调用者信息数组中是否存在 'function' 键
	    if (isset($caller['function'])) {
	        // 如果存在，则将逻辑类名设置为调用函数的名称
		    $callerFunctionName = $caller['function'];
	    }
		if (isset($caller['class'])) {
			$callerClassName = strtolower(substr(
										$caller['class'],
										strrpos($caller['class'],'\\')+1,
										strlen($caller['class'])
								));
		}
        // 在逻辑类名前加上固定命名空间，并将首字母大写
        $logicClassName = "app\\admin\\logic\\$callerClassName\\" . ucfirst($callerFunctionName);
        // 检查对应逻辑类名的类是否存在
        if (class_exists($logicClassName)) {
            // 如果存在，则创建逻辑类的实例
            $logic = new $logicClassName();
            // 执行逻辑类实例的 run 方法并返回结果
            return $logic->run();
        }
        // 如果类不存在，则抛出异常，表示未找到逻辑类
        throw new LogicException("logic [$logicClassName] is not found!", 40001);
	}

}